home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
TECHNICA
/
COMPUTER
/
H254.ZIP
/
IRITSM3S.ZIP
/
CAGD_LIB
/
CAGDEXTR.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-05-18
|
3KB
|
93 lines
/******************************************************************************
* CagdEXTR.c - Extrusion operator out of a given profile and a direction vec. *
*******************************************************************************
* Written by Gershon Elber, Mar. 91. *
******************************************************************************/
#ifdef __MSDOS__
#include <stdlib.h>
#include <string.h>
#include <alloc.h>
#endif /* __MSDOS__ */
#include "cagd_loc.h"
/******************************************************************************
* Constructs an extrusion surface in the Vector direction for the given *
* profile curve. Input curve be either a Bspline or a Bezier curve and the *
* resulting output surface will be of the same type. *
******************************************************************************/
CagdSrfStruct *CagdExtrudeSrf(CagdCrvStruct *Crv, CagdVecStruct *Vec)
{
CagdSrfStruct *Srf;
int i, j,
MaxCoord = CAGD_NUM_OF_PT_COORD(Crv -> PType),
Len = Crv -> Length;
CagdPointType
PType = Crv -> PType;
CagdBType
IsNotRational = !CAGD_IS_RATIONAL_CRV(Crv);
CagdRType **SrfPoints,
**CrvPoints = Crv -> Points,
*Dir = Vec->Vec;
switch (PType) {
case CAGD_PT_P2_TYPE:
PType = CAGD_PT_P3_TYPE;
break;
case CAGD_PT_E2_TYPE:
PType = CAGD_PT_E3_TYPE;
break;
case CAGD_PT_P3_TYPE:
case CAGD_PT_E3_TYPE:
break;
default:
FATAL_ERROR(CAGD_ERR_UNSUPPORT_PT);
break;
}
switch (Crv -> GType) {
case CAGD_CBEZIER_TYPE:
Srf = BzrSrfNew(Len, 2, PType);
break;
case CAGD_CBSPLINE_TYPE:
Srf = BspSrfNew(Len, 2, Crv -> Order, 2, PType);
GEN_COPY(Srf -> UKnotVector, Crv -> KnotVector, sizeof(CagdRType) *
(Len + Crv -> Order));
Srf -> VKnotVector[0] = Srf -> VKnotVector[1] = 0.0;
Srf -> VKnotVector[2] = Srf -> VKnotVector[3] = 1.0;
break;
case CAGD_CPOWER_TYPE:
FATAL_ERROR(CAGD_ERR_POWER_NO_SUPPORT);
return NULL;
default:
FATAL_ERROR(CAGD_ERR_UNDEF_CRV);
return NULL;
}
/* Copy the control mesh - first row is exactly the same as the curve */
/* while second one is the same as first one translated by Vec. */
SrfPoints = Srf -> Points;
for (i = IsNotRational; i <= MaxCoord; i++) /* First row. */
GEN_COPY(SrfPoints[i], CrvPoints[i],
sizeof(CagdRType) * Len);
/* Make a copy of the Second row do we can "work" on it. */
for (i = IsNotRational; i <= MaxCoord; i++) /* Second row. */
GEN_COPY(&SrfPoints[i][Len], CrvPoints[i],
sizeof(CagdRType) * Len);
/* If the curve has lesser dimension (i.e. was 2D), Add zeros. */
for (i = MaxCoord + 1; i <= 3; i++)
for (j = 0; j < Len * 2; j++)
SrfPoints[i][j] = 0.0;
for (i = 1; i <= 3; i++) /* Translate the second row. */
for (j = Len; j < Len * 2; j++)
SrfPoints[i][j] += IsNotRational ? Dir[i - 1] :
Dir[i - 1] * SrfPoints[W][j];
return Srf;
}